Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.04.2016, 17:58
Интересующийся
Отправить личное сообщение для max_fruit Посмотреть профиль Найти все сообщения от max_fruit
 
Регистрация: 08.04.2016
Сообщений: 10

Объединение разных объектов JSON
Всем привет! Сразу принесу извинения за "многобукаф".
Есть JSON, который выглядит следующим образом:
response: {
    items: [
    {from_id: 111111,
    message: 'Hello world'},
    {from_id: 111111,
    message: 'Hello world'},
    {from_id: 111112,
    message: 'Lorem ipsum'},
    ],
    profiles:[
    {id: 111111,
    first_name: 'Иван'},
    {id: 111112,
    first_name: 'Степан'}
    ]
}


Моя задача заключается в том, чтобы объединить данные из разных объектов, а именно:
first_name из profiles объединить с message из items. И объединить их таким образом, чтобы они действительно соответствовали друг другу.
Как я пробовал это сделать:
Не буду расписывать весь код, дабы не перегружать и без того объемный текст, перейду к сути:
var items_message = data.response.items.length; 
var profiles_count = data.response.profiles.length;

for (var i=0; i<profiles_count; i++) {
  for (var j=0; j<items_message; j++)
{
if(data.respone.profiles[i].id !== data.response.items[j].from_id)continue;
var profilesStr += data.response.profiles[i].first_name + ' ' + 'Написал:' + ' ' + data.response.items[j].text;
document.getElementById('example').innerHTML = profilesStr;
 }; 
};

Такая конфигурация работает, но криво, т.е. и имена и посты вставляются в html, но не соответствуя друг другу. Плюс, если пользователь оставил несколько постов, то все они также вставляются в html.
Как решить данную задачу?
В итоге должно получаться, например:
'Иван написал: Hello world'

Последний раз редактировалось max_fruit, 23.04.2016 в 17:36.
Ответить с цитированием
  #2 (permalink)  
Старый 23.04.2016, 13:29
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от max_fruit
Как решить данную задачу?
Сперва соответственно данные из базы получить, где они связаны, а не разбиты по частям.
Ответить с цитированием
  #3 (permalink)  
Старый 23.04.2016, 14:48
Интересующийся
Отправить личное сообщение для max_fruit Посмотреть профиль Найти все сообщения от max_fruit
 
Регистрация: 08.04.2016
Сообщений: 10

А это возможно осуществить при работе с VK open API? Данный json я получаю в качестве ответа от VK (да, он выглядит несколько иначе, но суть та же), и, как я понял, это единственный способ взаимодействия с сервером (ну еще можно ту же информацию получить в формате xml).
Ответить с цитированием
  #4 (permalink)  
Старый 23.04.2016, 16:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от max_fruit
А это возможно осуществить при работе с VK open API?
Нет конечно, это же не ваш сервер. Странная логика однако в такой структуре, хотя если предполагается работа только с какими либо из них, возможно и удобно такое.

Ну тогда обходить profiles и получать их сообщения. Но что есть from_id - это идентификатор сообщения? Если так, то где автор 111112?
Ответить с цитированием
  #5 (permalink)  
Старый 23.04.2016, 17:44
Интересующийся
Отправить личное сообщение для max_fruit Посмотреть профиль Найти все сообщения от max_fruit
 
Регистрация: 08.04.2016
Сообщений: 10

Сообщение от laimas Посмотреть сообщение
Но что есть from_id - это идентификатор сообщения? Если так, то где автор 111112?
Да это идентификатор, указывающий на id пользователя, который оставил это сообщение. А на счет автора 111112 - пардон, это я опечатался. 111112 - это Степан (уже поправил).

Прошу прощения за глупый вопрос, но что значит "обходить"? В объекте profiles указаны только данные пользователя (напр., имя, фамилия, id, город и т.д.), в объекте items - грубо говоря, информация о его постах, в том числе и текст этих постов. Причем даже если человек оставляет несколько одинаковых постов, то в items их будет столько, сколько он их оставил, хотя в profiles его данные будут указаны единожды. Обходить, т.е. делать что-то подобное, что я пытался делать до этого (именно пытался )? Т.е. сравнивать from_id и id и на основании этого извлекать текст сообщений?
Ответить с цитированием
  #6 (permalink)  
Старый 23.04.2016, 19:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

max_fruit,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  </script>
</head>

<body>
 <script>
    var data = {
        response: {
            items: [{
                from_id: 111111,
                message: 'Hello world'
            }, {
                from_id: 111111,
                message: 'Hello world'
            }, {
                from_id: 111112,
                message: 'Lorem ipsum'
            }, ],
            profiles: [{
                id: 111111,
                first_name: 'Иван'
            }, {
                id: 111112,
                first_name: 'Степан'
            }]
        }
    }
    var first_name = data.response.profiles.reduce(function(obj, el) {
            obj[el.id] = el['first_name'];
            return obj
        }, {}),
        mes = data.response.items.map(function(el) {
            var id = el['from_id'];
            return first_name[id] + ' написал: ' + el.message
        })
    document.write(mes.join('<br>'))

 </script>

</body>
</html>
Ответить с цитированием
  #7 (permalink)  
Старый 23.04.2016, 21:11
Интересующийся
Отправить личное сообщение для max_fruit Посмотреть профиль Найти все сообщения от max_fruit
 
Регистрация: 08.04.2016
Сообщений: 10

Огромное спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 24.04.2016, 18:50
Интересующийся
Отправить личное сообщение для max_fruit Посмотреть профиль Найти все сообщения от max_fruit
 
Регистрация: 08.04.2016
Сообщений: 10

рони, ответьте, пожалуйста еще на два вопроса:

1) Если объект profiles имеет вид:
profiles: [{
first_name: {
eng:'Ivan',
rus:'Иван'
}
}]
, то почему не получается обратиться к нему вот таким способом: el['first_name']['rus'] (или el.first_name.rus) ?
2) Как при использовании метода reduce правильно использовать оператор if?
Попробовал следующим образом:
var first_name = data.response.profiles.reduce(function(obj, el) {
 if(el['first_name'] !== 'Степан') {
            obj[el.id] = el['first_name'];
            return obj
          } // так не работает
        }, {}),
        mes = data.response.items.map(function(el) {
            var id = el['from_id'];
            return first_name[id] + ' написал: ' + el.message
        })
    document.write(mes.join('<br>'))

Как, например, вывести сообщения только от Ивана, но не выводить сообщения от Степана?

Последний раз редактировалось max_fruit, 24.04.2016 в 18:53.
Ответить с цитированием
  #9 (permalink)  
Старый 24.04.2016, 19:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

max_fruit,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  </script>
</head>

<body>
 <script>
    var data = {
        response: {
            items: [{
                from_id: 111111,
                message: 'Hello world'
            }, {
                from_id: 111111,
                message: 'Hello world'
            }, {
                from_id: 111112,
                message: 'Lorem ipsum'
            }, ],

            profiles: [{
                id: 111111,
                first_name: {
                    eng: 'Ivan',
                    rus: 'Иван'
                }
            }, {
                id: 111112,
                first_name: {
                    eng: 'Stepan',
                    rus: 'Степан'
                }
            }]
        }
    }
    var first_name = data.response.profiles.reduce(function(obj, el) {
            obj[el.id] = el['first_name']['rus'];
            return obj
        }, {}),
        mes = data.response.items.filter(function(el) {
            var id = el['from_id'];
            return first_name[id] != 'Степан'
        }).map(function(el) {
            var id = el['from_id'];
            return first_name[id] + ' написал: ' + el.message
        })
    document.write(mes.join('<br>'))
 </script>

</body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 24.04.2016, 19:29
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от max_fruit Посмотреть сообщение
Всем привет! Сразу принесу извинения за "многобукаф".
Есть JSON, который выглядит следующим образом:
response: {
    items: [
    {from_id: 111111,
    message: 'Hello world'},
    {from_id: 111111,
    message: 'Hello world'},
    {from_id: 111112,
    message: 'Lorem ipsum'},
    ],
    profiles:[
    {id: 111111,
    first_name: 'Иван'},
    {id: 111112,
    first_name: 'Степан'}
    ]
}
из формальных соображений нужно сделать поправку, что это не json
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение 2ух объектов полученных при помощи XMLHttpRequest PawelGil AJAX и COMET 12 23.08.2015 12:56
объединение объектов SunYang Общие вопросы Javascript 2 10.11.2014 20:37
Проблема с разбором JSON (название одного из объектов начинается с цифры) modelka AJAX и COMET 9 28.10.2014 10:34
клонирование двух разных объектов на 1 страницы angel__2003 jQuery 1 16.10.2012 19:40
Разная работа скрипта с JSON на разных хостингах Rokugan Общие вопросы Javascript 1 03.10.2011 13:16